/*
 * Essa classe Recebe um array de bytes e verifica se é Tentaiva de Login, Mensagem de texto, arquivo ou vídeo
 * e chama um método de Servidor correspondente ao tipo.
 * 
 */
package app.Servidor;

import geral.pack.Carta;
import java.io.*;
import java.net.InetAddress;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Pedro
 */
public class Decodificador extends Thread {

    private Servidor servidor;
    private byte dado[];

    public Decodificador(Servidor servidor) {
        this.servidor = servidor;
    }

    public void Decodificar(byte[] mensagem, InetAddress address) {
        Carta msg = null;
        Object obj = ByteToObj(mensagem);
        if (!obj.equals(null)) {
            msg = (Carta) obj;
            dado = msg.getDado();
            /*
             * Faz o cadastro, e envia uma resposta pro servidor do cliente
             */
            if (msg.getTipo().equalsIgnoreCase("cadastro")) {
                String aux = new String(dado);
                String[] aux2 = aux.split("#");
                Carta resp = null;
                if (servidor.CadastraCliente(aux2[0], aux2[1], address, aux2[2], Integer.parseInt(aux2[3]),
                        Integer.parseInt(aux2[4]))) {
                    byte[] b = ("sim").getBytes();
                    resp = new Carta("", null, "resposta", 0, true, true, b);
                } else {
                    byte[] b = ("não").getBytes();
                    resp = new Carta("", null, "resposta", 0, true, true, b);
                }
                byte[] pac = this.ObjToByte(resp);
                ClientUdp c1 = new ClientUdp();
                try {
                    c1.enviar(address, Integer.parseInt(aux2[3]), pac);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Decodificador.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            //---------------------------------- Loguin ---------------------------------------------
            if (msg.getTipo().equalsIgnoreCase("loguin")) {
                String[] aux = new String(dado).split("#");
                Carta resp = null;
                byte[] b = null;
                System.out.println("Loguin: " + aux[0] + ":" + aux[1]);
                if (servidor.LogarCliente(aux[0], aux[1], address)) {
                    b = ("sim#" + this.servidor.getListaClientes().get(aux[0]).getTipo()).trim().getBytes();
                } else {
                    b = ("não").trim().getBytes();
                }
                resp = new Carta("", null, "resposta loguin", 0, true, true, b);
                b = this.ObjToByte(resp);
                int port = Integer.parseInt(aux[2]);
                ClientUdp c1 = new ClientUdp();
                try {
                    c1.enviar(address, port, b);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Decodificador.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            /*
             * Recebe Confirmação de que o cliente está Online.
             */
            if (msg.getTipo().equalsIgnoreCase("online")) {
                String[] aux = new String(dado).split("#");
                servidor.setFlagOn(true);
                servidor.setUser(servidor.getListaClientes().get(aux[1]));
            }
            if (msg.getTipo().equalsIgnoreCase("texto") || msg.getTipo().equalsIgnoreCase("arquivo")
                    || msg.getTipo().equalsIgnoreCase("Video")) {
                try {
                    servidor.encaminhar(msg.getDestino(), mensagem);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Decodificador.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } else {
            System.out.println("Erro de Envio/Cast!");
        }
    }

    //Converte um Objeto serializavel para um Array de bytes.
    private byte[] ObjToByte(Object obj) {
        byte[] bytes = null;
        if (obj == null) {
            return null;
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(obj);
            oos.flush();
            oos.close();
            bos.close();
            bytes = bos.toByteArray();
        } catch (IOException ex) {
            System.out.println("Erro de Serialização.");
        }
        return bytes;
    }

    //Converte um Objeto serializado para Object.
    private Object ByteToObj(byte[] bytes) {
        Object obj = null;
        try {
            ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bis);
            obj = ois.readObject();
        } catch (IOException ex) {
            System.out.println("Erro IO");
        } catch (ClassNotFoundException ex) {
            System.out.println("CLass");
        }
        return obj;
    }
}